// properties.cpp: implementation of the Cproperties class.
//
//////////////////////////////////////////////////////////////////////

#include "properties.h"

//#ifdef _DEBUG
//#undef THIS_FILE
//static char THIS_FILE[]=__FILE__;
//#define new DEBUG_NEW
//#endif

#define LONG_LINEA 200


//al crear, o abrir el archivo de propiedades le pones la direccion url
Cproperties::Cproperties(string location)
{
	this->archivo=location;
}

Cproperties::Cproperties()
{
}

Cproperties::~Cproperties()
{
	if(mapa.empty()==false){
//	crearnuevo();
//    saveAllProperties();
	this->mapa.clear();}
}

//Carga al mapa la URL que se le paso al constructor
void Cproperties::CargarMapa()
{
	char *pFinal,*pToken;
	char linea[LONG_LINEA]={0};
	string key,value;
	
	if ((fp=fopen(archivo.c_str(),"rt"))!=NULL)
	{	
		do{
			pFinal=fgets(linea,LONG_LINEA,fp);
			if (pFinal!=0)
			{
				pToken=strtok(linea,"=");
				key = pToken;
				pToken=strtok(NULL,"\n");
				value = pToken;
				mapa.insert(entry(key,value));
			}
		}while (pFinal!=0);
		fclose(fp);
	}
}

//Se obtiene de mapa la value con la key asociada
string Cproperties::GetKey(string key)
{
	map<string,string>::iterator iter;
	iter=mapa.find(key);
	if (iter != mapa.end()) 
		return iter->second;
	else
		return "";
}

//Se guarda en el mapa la key con la value asociada
int Cproperties::SetKey(string key,string value)
{
	mapa.insert(entry(key,value));
	return 0;
}

//Se guarda en el mapa la key con la value asociada
int Cproperties::updateKeyValue(string key,string value)
{
	mapa.erase(key);
	mapa.insert(entry(key,value));
	return 0;
}

int Cproperties::saveAllProperties()
{
	fp=fopen(archivo.c_str(),"wt");
//	if (fp==NULL){
//		fp=fopen(archivo.c_str(),"wt");
//	}
	if (fp==NULL){
		return -1;
	}
	map<std::string,std::string>::iterator it;
	for ( it=mapa.begin() ; it != mapa.end(); it++ ){
		std::string linea = (*it).first + "=" +(*it).second+"\n";
		fputs(linea.c_str(),fp);
	}
	fclose(fp);
	return 0;
}

//busca si existe la clave y te devuelve el valor asociado a la clave 
//supongo que no puede haber 2 claves iguales, si lo hay agarra la 1ra.
string Cproperties::getProperty(string key)
{
	char *pFinal,*pToken;
	char linea[LONG_LINEA + 1] = {0};

	if ((fp=fopen(archivo.c_str(),"rt"))!=NULL)
	{	
		do{
			pFinal=fgets(linea,LONG_LINEA,fp);
			pToken=strtok(linea,"=");
			if (!strcmp(pToken,key.c_str()))
			{
				pToken=strtok(NULL,"\n");
				fclose(fp);
				string respuesta;
				respuesta=pToken;
				return respuesta;
			}
		}while (pFinal!=0);
		fclose(fp);
	}
	string respuesta="";
	return respuesta;
}

//te arma el archivo de propiedades con la clave=value
int Cproperties::setProperty(string key,string value)
{
	string linea;
	linea=key+"="+value+"\n";
	if ((fp=fopen(archivo.c_str(),"at"))!=NULL)
	{	
		fwrite(linea.c_str(),strlen(linea.c_str()),1,fp);
		fclose(fp);
		return 0;
	}
	return 1;
}

//borra el properties.txt del rigido para volverlo a crear con el ip nuevo
int Cproperties::borrar()
{
	int returno;
	returno=remove(archivo.c_str());
	return returno;
}

int Cproperties::getSize(){
	return this->mapa.size();
}

int Cproperties::crearnuevo()
{
	if ((fp=fopen(archivo.c_str(),"wt"))==NULL)
	{
		
		return 1;
	}
	fclose(fp);
	return 0;
}
int Cproperties::resetProperties()
{
	if(this->mapa.empty()==true)
	{
		this->CargarMapa();
	}
	fp=fopen(archivo.c_str(),"wt");
//	if (fp==NULL){
//		fp=fopen(archivo.c_str(),"wt");
//	}
	if (fp==NULL){
		return -1;
	}
	std::string  linea;
	map<std::string,std::string>::iterator it;
	for ( it=mapa.begin() ; it != mapa.end(); it++ ){
		linea = (*it).first + "=0\n";
		(*it).second="0";
		fputs(linea.c_str(),fp);
		//updateKeyValue((*it).first,"0");
		
	}
	fclose(fp);

	return 0;
}
